import java.util.concurrent.atomic.AtomicInteger;

public class CasHello {
    public static void main(String[] args) {
        // 创建一个 AtomicInteger 实例，初始值为 5。
        // 这意味着在内存中，这个整数值是 5。
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println("初始值: " + atomicInteger.get());

        // 演示 compareAndSet 方法（CAS 的核心）
        // 这是一个成功的 CAS 操作。
        // - Compare: 检查内存中的值是否为预期的 5。
        // - Swap: 如果是，就将其更新为 2025。
        // - 该方法返回 true 表示操作成功。
        System.out.println("第一次 CAS 操作: " + atomicInteger.compareAndSet(5, 2025) + "\t 当前值: " + atomicInteger.get());

        // 再次尝试 CAS 操作，这次会失败。
        // - Compare: 检查内存中的值是否为预期的 5。
        // - 此时内存中的实际值是 2025，与预期值 5 不符。
        // - Swap: 操作不会执行。
        // - 该方法返回 false 表示操作失败，atomicInteger 的值保持不变。
        System.out.println("第二次 CAS 操作: " + atomicInteger.compareAndSet(5, 1111) + "\t 当前值: " + atomicInteger.get());

        System.out.println("---- 以下是基于 CAS 实现的复合操作 ----");

        // incrementAndGet() - 原子性的“先加一，再获取” (相当于 ++i)
        // 当前值是 2025，加 1 后变为 2026，返回新值。
        System.out.println("incrementAndGet: " + atomicInteger.incrementAndGet());

        // getAndIncrement() - 原子性的“先获取，再加一” (相当于 i++)
        // 它会先返回变量的当前值，然后再对其进行 +1 操作。
        // 返回当前值 2026，之后内部值变为 2027。
        System.out.println("getAndIncrement: " + atomicInteger.getAndIncrement() + "\t 操作后当前值: " + atomicInteger.get());

        // 6. addAndGet(delta) - 原子性的“先增加指定值，再获取”
        // 当前值是 2027，增加 3 后变为 2030，返回新值。
        System.out.println("addAndGet(3): " + atomicInteger.addAndGet(3));
    }
}